package com.sys.app.entity.tag;

import com.alibaba.druid.util.StringUtils;
import com.sys.app.entity.util.StringUtil;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.JdbcOperations;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.spring5.context.SpringContextUtils;
import org.thymeleaf.templatemode.TemplateMode;


/**
 * 控件：文本输入框，含富文本，时间，数据微调
 */
public class easyUITextBox extends AbstractElementTagProcessor {
    // 标签名
    private static final String TAG_NAME = "input";

    // 优先级
    private static final int PRECEDENCE = 10000;


    /*
   templateMode: 模板模式，这里使用HTML模板。
   dialectPrefix: 标签前缀。即xxx:text中的xxx。
   elementName：匹配标签元素名。举例来说如果是div，则我们的自定义标签只能用在div标签中。为null能够匹配所有的标签。
   prefixElementName: 标签名是否要求前缀。
   attributeName: 自定义标签属性名。这里为text。
   prefixAttributeName：属性名是否要求前缀，如果为true，Thymeeleaf会要求使用text属性时必须加上前缀，即xxx:text。
   precedence：标签处理的优先级，此处使用和Thymeleaf标准方言相同的优先级。
   removeAttribute：标签处理后是否移除自定义属性。
   */
    public easyUITextBox(String dialectPrefix) {
        super(
                // 模板类型为HTML
                TemplateMode.HTML,
                // 标签方言前缀
                dialectPrefix,
                // 标签名称
                TAG_NAME,
                // 将标签前缀应用于标签名称
                true,
                // 无属性名称：将通过标签名称匹配
                null,
                // 没有要应用于属性名称的前缀
                false,
                // 优先级
                PRECEDENCE
        );
    }
    /**
     * 处理自定义标签 DOM 结构
     *
     * @param iTemplateContext            模板页上下文
     * @param iProcessableElementTag      待处理标签
     * @param iElementTagStructureHandler 元素标签结构处理器
     */
    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
        // 获取 Spring 上下文
       // ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        // 获取注入bean工厂
        //AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
        // 获取所需的bean，一般情况下这里我们直接使用Jdbc来操作数据库，因为它是一个公共组件，数据源不确定，所以要使用动态sql
        //JdbcOperations jdbcOperations = autowireCapableBeanFactory.getBean(JdbcOperations.class);
        //name属性
        String name = iProcessableElementTag.getAttributeValue("name");
        //type属性
        String vtype = iProcessableElementTag.getAttributeValue("vtype");
        //是否必填
        String required=iProcessableElementTag.getAttributeValue("required");
        required = StringUtils.isEmpty(required) ? "false" : required;
        //是否只读
        String readonly=iProcessableElementTag.getAttributeValue("readonly");
        readonly = StringUtils.isEmpty(readonly) ? "false" : readonly;
        //显示文字
        String label=iProcessableElementTag.getAttributeValue("label");
        //默认值
        String value = iProcessableElementTag.getAttributeValue("value");
        if (StringUtils.isEmpty(value) || "null".equals(value)) {
           value = "";
        }
        //min和最大值max,数字精度precision="2"
        String min = iProcessableElementTag.getAttributeValue("min");
        if (StringUtils.isEmpty(min)) {
            min ="0";
        }
        String max = iProcessableElementTag.getAttributeValue("max");
        if (StringUtils.isEmpty(max)) {
            max ="99999999999";
        }
        String precision = iProcessableElementTag.getAttributeValue("precision");
        if (StringUtils.isEmpty(precision)) {
            precision ="0";
        }

        //几行展示
        //width= col-md-6 col-sm-12 二行显示
        //width="col-md-10" 一行显示
        String width = iProcessableElementTag.getAttributeValue("width");
        width = StringUtils.isEmpty(width) ? "col-md-6 col-sm-12" : width;
        //labelWidth col-sm-5 col-md-2 二行显示
        String labelWidth = iProcessableElementTag.getAttributeValue("labelWidth");
        if (StringUtils.isEmpty(labelWidth)) {
            labelWidth ="col-sm-5 col-md-4";
        }
        //inputWidth col-sm-7 col-md-10 二行显示
        String inputWidth = iProcessableElementTag.getAttributeValue("inputWidth");
        if (StringUtils.isEmpty(inputWidth)) {
            inputWidth ="col-sm-7 col-md-8";
        }
        StringBuffer result = new StringBuffer();
        result.append("<div ");
        result.append("class=\"").append(String.format("%s %s","form-group",width)).append("\" ");
        result.append(">");
        result.append("<div class=\"row\">");

        result.append("<label ");
        result.append("for=\"").append(name).append("\" ");
        result.append("class=\"").append(String.format("%s control-label text-right",labelWidth)).append("\" ");
        //result.append("class=\"col-sm-5 col-md-4 control-label text-right\"");
        result.append(">");
        if("true".equals(required.toLowerCase())) {
            result.append("<b>*</b>");
        }
        result.append(label);
        result.append("</label>");

        //result.append("<div class=\"col-sm-7 col-md-8\">");
        result.append("<div ");
        result.append("class=\"").append(inputWidth).append("\" ");
        result.append(">");
        //----------------------------------------------控件开始-------------------------------------
        //控件公用属性
        result.append("<input ");
        result.append("id=\"").append(name.replace(".","_")).append("\" ");
        result.append("name=\"").append(name).append("\" ");
        result.append("value=\"").append(value).append("\" ");

        if ("true".equals(readonly.toLowerCase())) {
            result.append("readonly=\"").append(readonly).append("\" ");
        }
        result.append("required=\"").append(required).append("\" ");


        //easyui-textbox,easyui-textarea
        if("text".equals(vtype)||"textarea".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-textbox")).append("\" ");
        }
        //easyui-numberbox
        if("int".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-numberbox")).append("\" ");
            result.append(String.format(" min=%s max=%s precision=%s ",min,max,"0"));
        }
        if("float".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-numberbox")).append("\" ");
            result.append(String.format(" min=%s max=%s precision=%s ",min,max,precision));
        }
        //easyui-numberspinner
        if("number".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-numberspinner")).append("\" ");
            result.append(String.format(" min=%s max=%s precision=%s ",min,max,precision));
        }
        //easyui-datebox (yyyy-MM-dd)
        if("datebox".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-datebox")).append("\" ");
            result.append("data-options=\"formatter:dateboxformatter,parser:dateboxParser\"");
        }
        //easyui-datetimebox (yyyy-MM-dd HH:mm:ss)
        if("datetimebox".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-datetimebox")).append("\" ");
            result.append("data-options=\"formatter:dateboxTimeformatter,parser:dateboxParser\"");
        }
        //easyui-passwordbox
        if("password".equals(vtype)){
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-passwordbox")).append("\" ");
        }
        //多行文本
        if("textarea".equals(vtype)){
            result.append("data-options=\"multiline:true\"");
            //多行文本设置默认高50px
            result.append(" style=\"").append(" width:100%;height:50px").append("\" ");
        }else{
            //其他默认设置，不需要修改
            result.append(" style=\"").append(" width:100% ").append("\" ");
        }
        result.append("/>");

        //----------------------------------------------控件结束-------------------------------------


        result.append("</div>");

        result.append("</div>");
        result.append("</div>");
        // 创建将替换自定义标签的 DOM 结构
        IModelFactory modelFactory = iTemplateContext.getModelFactory();
        IModel model = modelFactory.createModel();
        // 这里是将字典的内容拼装成HTML
        model.add(modelFactory.createText(result));
        // 利用引擎替换整合标签
        iElementTagStructureHandler.replaceWith(model, false);
    }
}
